package com.dingding.manager.modules.system.service.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.dingding.manager.common.beans.sys.SysRole;
import com.dingding.manager.common.beans.sys.SysRoleMenu;
import com.dingding.manager.common.dao.Page;
import com.dingding.manager.common.exception.BussinessException;
import com.dingding.manager.common.exception.enums.BizExceptionEnum;
import com.dingding.manager.core.aop.log.LogRecord;
import com.dingding.manager.core.shiro.ShiroKit;
import com.dingding.manager.core.shiro.ShiroUser;
import com.dingding.manager.core.util.ToolUtil;
import com.dingding.manager.modules.system.dao.RoleDao;
import com.dingding.manager.modules.system.dto.role.ReqAddRoleDTO;
import com.dingding.manager.modules.system.dto.role.ReqRoleListDTO;
import com.dingding.manager.modules.system.dto.role.ResRoleDTO;
import com.dingding.manager.modules.system.service.RoleService;

/**
 * @ClassName: RoleServiceImpl
 * @Description: 角色管理Service实现类
 * @author SUNZHICHENG
 * @date 2016年12月1日 下午1:54:34
 * @version V2.6.2
 */
@Service("roleService")
public class RoleServiceImpl implements RoleService {

	@Resource(name = "roleDao")
	RoleDao roleDao;

	/**
	 * @Description: 根据角色id查询角色信息
	 * @date 2016年12月1日 下午2:40:57
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */

	@Override
	@Transactional(readOnly = true)
	public ResRoleDTO getRoleById(Integer roleId) {
		return roleDao.getRoleById(roleId);
	}

	/**
	 * @Description: 根据用户名查询角色信息
	 * @param name
	 *            用户名
	 * @date 2016年12月2日 下午10:44:29
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */

	@Override
	@Transactional(value = "txManager", readOnly = true)
	public List<SysRole> getRoleByName(String name) {
		if (ToolUtil.isNotEmpty(name)) {
			return roleDao.getRoleByName(name);
		}
		return null;
	}

	/**
	 * @Description: 查询所有角色列表
	 * @date 2016年12月5日 下午1:56:23
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */
	@Transactional(value = "txManager", readOnly = true)
	public List<SysRole> getRoleList() {
		return roleDao.getRoleList();

	};

	/**
	 * @Description: 查询所有的角色列表或按照条件查询角色列表
	 * @param condition
	 *            查询条件
	 * @date 2016年12月1日 下午2:43:02
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */
	@Transactional(readOnly = true)
	@Override
	public Page<ResRoleDTO> getRoleList(ReqRoleListDTO reqRoleListDTO, Integer start, Integer length) {
		// 查询角色列表
		Page<ResRoleDTO> roleList = roleDao.getRoleList(reqRoleListDTO, start, length);
		return roleList;
	}

	/**
	 * @Description: 保存角色信息（新建角色）
	 * @date 2016年12月1日 下午2:45:13
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="角色管理",option="添加")
	@Override
	@Transactional(readOnly = false)
	public void addRole(ReqAddRoleDTO reqAddRoleDTO) {
		// 获取当前登录用户信息
		ShiroUser shiroUser = ShiroKit.getUser();
		Integer currentId = shiroUser.getId();

		// 是否已存在此角色名roleEnName
		if (ToolUtil.isNotEmpty(reqAddRoleDTO.getRoleEnName())) {
			List<SysRole> roles = roleDao.getRolesByName(reqAddRoleDTO.getRoleEnName(), reqAddRoleDTO.getRoleName());
			if (!roles.isEmpty()) {
				throw new BussinessException(BizExceptionEnum.INFO_REPEAT);
			}

			// 给角色赋值
			SysRole role = new SysRole();

			role.setRoleName(reqAddRoleDTO.getRoleName());
			role.setRoleEnName(reqAddRoleDTO.getRoleEnName());
			role.setRoleType(reqAddRoleDTO.getRoleType());
			role.setRoleStatus(reqAddRoleDTO.getRoleStatus());
			role.setDataScope(reqAddRoleDTO.getDataScope());
			role.setCreateUserId(currentId);
			role.setCreateTime(new Date());
			role.setRemarks(reqAddRoleDTO.getRemarks());
			roleDao.addRole(role);
		}

	}

	/**
	 * @Description: 修改角色信息
	 * @date 2016年12月1日 下午2:48:02
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="角色管理",option="修改")
	@Override
	@Transactional(readOnly = false)
	public void modifyRole(ReqAddRoleDTO reqAddRoleDTO, Integer sysRoleId) {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		// 获取要修改的角色
		ResRoleDTO roleDTO = roleDao.getRoleById(sysRoleId);
		// 获取当前登录用户信息
		ShiroUser shiroUser = ShiroKit.getUser();
		Integer currentId = shiroUser.getId();
		if (ToolUtil.isNotEmpty(reqAddRoleDTO.getRoleEnName())) {
			// 是否已存在此角色名roleEnName
			List<SysRole> roles = roleDao.getRolesByName(reqAddRoleDTO.getRoleEnName(), reqAddRoleDTO.getRoleName());
			if (roles.size() > 0) {
				for (SysRole sysRole : roles) {
					// 判断要修改的信息与已存在信息是否同一信息
					if (!sysRole.getSysRoleId().equals(roleDTO.getSysRoleId())) {
						throw new BussinessException(BizExceptionEnum.INFO_REPEAT);
					}
				}
			}
			SysRole role = new SysRole();
			role.setSysRoleId(roleDTO.getSysRoleId());
			role.setRoleName(reqAddRoleDTO.getRoleName());
			role.setRoleEnName(reqAddRoleDTO.getRoleEnName());
			role.setRoleType(reqAddRoleDTO.getRoleType());
			role.setRoleStatus(reqAddRoleDTO.getRoleStatus());
			role.setDataScope(reqAddRoleDTO.getDataScope());
			role.setCreateUserId(roleDTO.getCreateUserId());

			if (ToolUtil.isNotEmpty(roleDTO.getCreateTime())) {
				try {
					role.setCreateTime(sdf.parse(roleDTO.getCreateTime()));
				} catch (ParseException e) {
					e.printStackTrace();
					throw new BussinessException(BizExceptionEnum.SERVER_ERROR);
				}
			}

			role.setUpdateUserId(currentId);
			role.setUpdateTime(new Date());
			role.setRemarks(reqAddRoleDTO.getRemarks());
			roleDao.addRole(role);

		}

	}

	/**
	 * @Description: 删除角色
	 * @param roleId
	 *            角色id
	 * @date 2016年12月1日 下午2:54:03
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="角色管理",option="删除")
	@Transactional(readOnly = false)
	public boolean deleteRole(Integer roleId) {
		return roleDao.deleteRole(roleId);
	};

	/**
	 * @Description: 修改角色是否可用状态
	 * @date 2016年12月1日 下午2:49:25
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="角色管理",option="启用/禁用")
	@Transactional(readOnly = false)
	public boolean modifyRoleState(Integer roleId, Integer state) {
		return roleDao.modifyRoleState(roleId, state);
	}

	/**
	 * @Description: 给角色授权（访问菜单的权限）
	 * @date 2016年12月9日 上午10:37:58
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="角色管理",option="授权")
	@Override
	@Transactional(readOnly = false)
	public boolean accreditToRole(Integer sysRoleId, List<Integer> sysMenuIds) {
		// 查询角色与菜单关联关系表，是否有关联
		List<SysRoleMenu> roleMenu = roleDao.getRoleMenu(sysRoleId);
		if (roleMenu.size() > 0) {
			// 如果有关联，删除所有关联关系
			roleDao.deleteRoleMenu(sysRoleId);
		}
		// 将新的权限信息添加到关联关系表
		for (int i = 0; i < sysMenuIds.size(); i++) {
			SysRoleMenu sysRoleMenu = new SysRoleMenu();
			sysRoleMenu.setSysRoleId(sysRoleId);
			sysRoleMenu.setSysMenuId(sysMenuIds.get(i));
			roleDao.addRoleMenu(sysRoleMenu);
		}
		return true;
	}

	/**
	 * @Description: 获取已授权列表
	 * @date 2016年12月9日 下午1:33:56
	 * @author SUNZHICHENG
	 * @since V2.6.2
	 */
	@Transactional(readOnly = true)
	@Override
	public List<SysRoleMenu> getAccreditList(Integer sysRoleId) {
		return roleDao.getRoleMenu(sysRoleId);
	};

}
